#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t capa)
: _capacity(capa)
, _que()
, _mutex()
, _notEmpty()
, _notFull()
{
}

TaskQueue::~TaskQueue()
{
}

//添加与获取数据
void TaskQueue::push(const int &value)
{
    //1、上锁
    /* _mutex.lock(); */
    //unique_lock具有RAII的思想，只管上锁，不用手动解锁
    unique_lock<mutex> ul(_mutex);

    //2、判满
    while(full())
    {
        //2.1、如果仓库是满的，在条件变量上睡眠
        _notFull.wait(ul);
    }
    //2.2、如果仓库不满，生产数据将其放在仓库中,然后唤醒消费者
    _que.push(value);
    _notEmpty.notify_one();
    //3、解锁
    /* _mutex.unlock(); */
}

int TaskQueue::pop()
{
    //unique_lock具有RAII的思想，只管上锁，不用手动解锁
    unique_lock<mutex> ul(_mutex);
    while(empty())//虚假唤醒
    {
        _notEmpty.wait(ul);
    }

    int tmp = _que.front();//获取数据
    _que.pop();//然后删除
    _notFull.notify_one();//唤醒生产者

    return tmp;
}

//判空与判满
bool TaskQueue::empty() const
{
#if 0
    if(0 == _que.size())
    {
        return true;
    }
    else
    {
        return false;
    }
#endif
    return (0 == _que.size());
}

bool TaskQueue::full() const
{
    return (_capacity == _que.size());
}

